﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Security.Cryptography;
using System.IO;

/// <summary>
///DES 数据库加、解密
/// </summary>

public class DES
{
    const string KEY_64 = "XWG_Data";
    const string IV_64 = "XWG_Data"; //注意了，是8个字符，64位

    public DES()
    {
        //
        // TODO: 在此处添加构造函数逻辑
        //
    }
    #region 数据库加密
    /// <summary> 
    /// 数据库加密
    /// </summary>
    /// <param name="data">要加密的加密字段</param>
    /// <returns></returns>
    public static string Encode(string data)
    {
        if (string.IsNullOrEmpty(data))
            return "";
        byte[] byKey = System.Text.ASCIIEncoding.ASCII.GetBytes(KEY_64);
        byte[] byIV = System.Text.ASCIIEncoding.ASCII.GetBytes(IV_64);

        DESCryptoServiceProvider cryptoProvider = new DESCryptoServiceProvider();
        int i = cryptoProvider.KeySize;
        MemoryStream ms = new MemoryStream();
        CryptoStream cst = new CryptoStream(ms, cryptoProvider.CreateEncryptor(byKey, byIV), CryptoStreamMode.Write);

        StreamWriter sw = new StreamWriter(cst);
        sw.Write(data);
        sw.Flush();
        cst.FlushFinalBlock();
        sw.Flush();
        return Convert.ToBase64String(ms.GetBuffer(), 0, (int)ms.Length);

    }
    #endregion 

    #region 数据库解密
    /// <summary>
    /// 数据库解密
    /// </summary>
    /// <param name="data">要解密的加密字段</param>
    /// <returns></returns>
    public static string Decode(string data)
    {
        if (string.IsNullOrEmpty(data))
            return "";
        byte[] byKey = System.Text.ASCIIEncoding.ASCII.GetBytes(KEY_64);
        byte[] byIV = System.Text.ASCIIEncoding.ASCII.GetBytes(IV_64);

        byte[] byEnc;
        try
        {
            byEnc = Convert.FromBase64String(data);
        }
        catch
        {
            return null;
        }

        DESCryptoServiceProvider cryptoProvider = new DESCryptoServiceProvider();
        MemoryStream ms = new MemoryStream(byEnc);
        CryptoStream cst = new CryptoStream(ms, cryptoProvider.CreateDecryptor(byKey, byIV), CryptoStreamMode.Read);
        StreamReader sr = new StreamReader(cst);
        return sr.ReadToEnd();
    }
    #endregion
}
